package com.hzw.saas.common.pay.unionpay.bean;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.hzw.saas.common.pay.unionpay.config.UnionPayConfig;
import lombok.Getter;

/**
 * 银联查询请求参数
 *
 * @author zzl
 * @since 2020-10-02
 */
@Getter
public class UnionQueryReqContent extends UnionTradeContent {

    /* 银联全渠道系统，产品参数，除了encoding自行选择外其他不需修改 */
    /**
     * 版本号，全渠道默认值
     */
    private String version;
    /**
     * 字符集编码，可以使用UTF-8,GBK两种方式
     */
    private String encoding;
    /**
     * 签名方法，默认
     */
    private String signMethod;
    /**
     * 交易类型 ，01：消费
     */
    private String txnType;
    /**
     * 交易子类型， 01：自助消费
     */
    private String txnSubType;
    /**
     * 业务类型，B2C网关支付，手机wap支付
     */
    private String bizType;

    /* 商户接入参数 */
    /**
     * 商户号码
     * 申请的正式商户号或者open上注册得来的777测试商户号
     */
    private String merId;
    /**
     * 接入类型
     * 0：商户直连接入
     * 1：收单机构接入
     * 2：平台商户接入
     */
    private String accessType;

    /**
     * 商户订单号，8-40位数字字母，不能含“-”或“_”
     * 支付与退款时新建
     * 查询时使用对应支付或退款的订单号
     */
    private String orderId;
    /**
     * 订单发送时间，取系统时间，格式为yyyyMMddHHmmss，必须取当前时间，否则会报txnTime无效
     * 支付与退款时为当前订单发送时间
     * 查询时使用对应支付或退款的订单号
     */
    private String txnTime;

    public void setTxnType(String txnType) {
        this.txnType = txnType;
    }

    public void setTxnSubType(String txnSubType) {
        this.txnSubType = txnSubType;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public void setTxnTime(String txnTime) {
        this.txnTime = txnTime;
    }

    public void setTxnTime(Date date) {
        this.txnTime = new SimpleDateFormat("yyyyMMddHHmmss").format(date);
    }

    protected void checkParams() {
        this.encoding = UnionPayConfig.config().getEncoding();
        this.version = UnionPayConfig.config().getVersion();
        this.signMethod = UnionPayConfig.config().getSignMethod();
        this.merId = UnionPayConfig.config().getMerId();

        this.bizType = "000201";
        this.accessType = "0";
    }

    @Override
    public Map<String, String> buildContent() {
        this.checkParams();
        String json = JSON.toJSONString(this);
        return JSON.parseObject(json, new TypeReference<HashMap<String, String>>() {
        });
    }

}
